#ifndef XLCOMM_BASE_FIXBUFFER_H_
#define XLCOMM_BASE_FIXBUFFER_H_

#include <stdio.h>

#include "xlcomm/define.h"
#include "xlcomm/noncopyable.h"

namespace xlcomm {

const int kSmallBufferSize = 4096;
const int kLargeBufferSize = 4096 * 1024;

// 固定大小的缓冲区
template <int SIZE>
class FixBuffer : noncopyable {
 public:
  FixBuffer() : used_(0) {
    XLCOMM_ASSERT0(SIZE > 0);
    MemZero(data_, sizeof data_);
  }
  ~FixBuffer() {
    // printf("~FixBuffer()\n");
  }

  // 追加数据到缓冲区
  void Append(const char* buff, size_t len) {
    if (used_ + len <= SIZE) {
      memcpy(data_ + used_, buff, len);
      used_ += len;
    } else if (used_ != SIZE) {
      memcpy(data_ + used_, buff, SIZE - used_);
      used_ = SIZE;
      fprintf(stderr, "FixBuffer is almost full! Append is not complete.");
    } else {
      fprintf(stderr, "FixBuffer is full! Append is ignored.");
    }
  }

  // 获取可用大小
  size_t AvailSize() { return SIZE - used_; }

  // 重置数据指针到起始位置
  void Reset() { used_ = 0; }

  // 重置数据指针到起始位置，并初始化所有数据为0
  void ResetZero() {
    used_ = 0;
    MemZero(data_, sizeof data_);
  }

  // 获取已使用大小
  size_t used() const { return used_; }

  // 获取数据指针
  const char* data() const { return data_; }

 private:
  char data_[SIZE];
  size_t used_;
};

}  // namespace xlcomm

#endif  // XLCOMM_BASE_FIXBUFFER_H_